programmersfandomcom_ru-20200215-history
Perl
Perl — высокоуровневый интерпретируемый динамический язык программированияобщего назначения, созданныйЛарри Уоллом, лингвистом по образованию. Название языка представляет собой аббревиатуру, которая расшифровывается как''Practical Extraction and Report Language'' «практический язык для извлечения данных и составления отчётов». Первоначально аббревиатура состояла из пяти символов и в таком виде в точности совпадала с английским словом''pearl'', жемчужина. Но затем стало известно, что такой язык существует (см. PEARL) и букву «а» убрали. Талисманом языка Perl являетсяверблюд— не слишком красивое, но очень выносливоеживотное, способное выполнять тяжёлую работу. Основной особенностью языка считаются его богатые возможности для работы с текстом, в том числе реализованные при помощи регулярных выражений. Перл унаследовал много свойств от языковСи, shell script, awk. Perl также знаменит огромной коллекциейдополнительных модулейCPAN, находящейся по адресу http://www.cpan.org(англ.). История Первые версии Ларри Уолл начал разработку Perl в 1987 году, когда работал программистом в Unisys . Версия 1.0 была выпущена и анонсирована в новостной группе comp.sources.misc 18 декабря 1987. как «„замена“ для awk и sed». Perl 2 был выпущен в 1988 году, основным нововведением в котором был переработаный механизм регулярных выражений. Perl 3, выпущенный в 1989 получил возможность обрабатывать потоки двоичных данных. Изначально, единственной документацией для Perl была единственная (огромной длины) man-страница. В 1991 году была выпущена к книга Programming Perl (известная многими программистами как «Верблюжая книга» ( ) из-за изображения на обложке), которая, де-факто, стала стандартом языка. В тоже самое время, версия языка была поднята до 4, не столько, чтобы указать на значительные изменения, сколько, чтобы обозначить, что эта версия языка документирована книгой. Ранний Perl 5 Perl 4 прошёл через серию релизов, остановившись на Perl 4.036 в 1993 году. В этот момент, Ларри Уолл забросил Perl 4 и начал работу над Perl 5. Разработка Perl 5 была начата в 1994 году. В тоже время был создан список рассылки perl5-porters для координации работы над портированием Perl 5 на различные платформы. Он до сих пор остаётся основным форумом по разработке, обслуживанию и портированию Perl 5.Архив списка рассылки perl5-porters Perl 5.000 был выпущен 17 октября 1994 года.perlhist — perldoc.perl.org Он включал в себя полностью переписанный интерпретатор, и включал в себя много новых языковых возможностей, таких как объекты, ссылки, локальные (my) переменные, и модули. Особенно важной частью были модули, так как они предоставили механизм расширения языка без модифицирования интерпретатора. Это позволило стабилизировать интерпретатор, но при этом, дало возможность обычным Perl-программистам добавлять в язык новые возможности. Perl 5 находится в активной разработке по сей день. Perl 5.001 был выпущен 13 марта 1995 года. Perl 5.002 увидел свет 29 февраля 1996 года с новой поддержкой прототипов. Это позволило авторам модулей создавать функции, которые вели себя так же, как и встроенные функции Perl. Версия Perl 5.003 появилась 25 июня 1996 и устраняла обнаружившиеся проблемы с безопасностью. Одно из важнейших событий в истории Perl 5 случилось за пределами собственно языка и было последствием поддержки модулей. 26 октября 1995 года начала свою работу CPAN (Всеобъемлющая Сеть Архивов Перл), которая стала репозиторием модулей Perl, а также исходного кода самого языка. На данный момент сеть насчитывает более 20000 модулей, созданных более чем 8000 программистами. Perl 5.004 был выпущен 15 мая 1997 года и содержал, кроме всего прочего, пакет UNIVERSAL, который давал языку основной объект, от которого автоматически происходили все классы. Была также включена возможность запрашивать версию модулей. В дополнении к этому Perl стал поддерживать Microsoft Windows, а также ряд других операционных систем.perl5004delta - perldoc.perl.org Perl 5.005 увидел свет 22 июня 1998 года. Этот релиз включал в себя несколько улучшений процессора регулярных выражений, новые перехваты в бэкенд с помощью B::* модулей, qr// оператор кавычек для регулярных выражений, большой выбор других новых модулей, а также поддержку ряда операционных систем, в частности BeOs.perl5005delta - perldoc.perl.org C 2000 по наше время Perl 5.6 был выпущен 22 марта 2000 года. Главные изменения включали поддержку 64-битных систем, представление строк в стандарте юникод, поддержку больших файлов (файлы больше 2 Гб) и ключевое слово «our».perl56delta - perldoc.perl.orgperl561delta - perldoc.perl.org Во время разработки Perl 5.6 было принято решение изменить схему наименования версий на более близкую к другим проектам с открытым исходным кодом. За версией 5.005_63 следовала версия 5.5.640, согласно плану версиям в разработке должны были присваиватся нечётные номера, стабильным версиям — чётные. В 2000 году Ларри Уолл выступил с призывом к сообществу активно обсуждать предложения к следующей версии Perl. Результатом этого обсуждения стал 361 документ RFC (Запрос комментариев), которые были использованы в разработке Perl 6. В 2001 году Apocalypse 1: The Ugly, the Bad, and the Good - dev.perl.org была начата работа над финальным документом, подводящим итог предложениям к созданию нового поколения Perl. Результат был представлен не в виде формального документа, а в качестве дайджеста всех RFC. К этому времени Perl 6 существовал исключительно в виде описания языка. Perl 5.8 был впервые выпущен 18 июля 2002 года и с этого момента получал ежегодное обновление. Последняя версия Perl 5.8 — 5.8.9 увидела свет 14 декабря 2008 года. Perl 5.8 улучшал поддержку юникода, добавлял новую реализацию ввода/вывода, добавлял поддержку многопоточности, увеличивал числовую точность и добавлял несколько новых модулей.perl58delta - perldoc.perl.org В 2004 году началась работа над Cинопсисом (Synopsis) — первоначально задумавшимся как ряд документов, подводящих итоги финального документа, упоминавшегося выше. Однако постепенно этот ряд документов и стал спецификацией Perl 6. В феврале 2005 года Audrey Tang начал работу над Pugs http://en.wikipedia.org/wiki/Pugs, интерпретатором Perl 6, написанном на Haskell.HaskellWiki Это было первой настоящей попыткой воплотить Perl 6 в реальность. Эта попытка заглохла в 2006 году. 18 декабря 2007 года, в день 20-летней годовщины Perl 1.0, была выпущена версия Perl 5.10.0. Эта версия содержала в себе ряд заметных нововведений, приближающих её к Perl 6. Одними из таких нововведений стали новые операторы switch (названных «given»/«when»), обновление регулярных выражений, а также «умный» оператор совпадения «~~».perldelta: what is new for perl 5.10.0Smart matching in detail Примерно в это же время всерьёз началась разработка новой имплементации Perl 6, известкой как Rakudo Perl http://en.wikipedia.org/wiki/Rakudo_Perl, разработанной в тандеме с виртуальной машиной Parrot. C ноября 2009 Rakudo Perl регулярно обновляется каждый месяц и является на данный момент самой полной имплементацией Perl 6. Значительное изменение процесса разработки Perl 5 произошло после появления Perl 5.11. Сообщество разработчиков перешло на ежемесячный цикл релизов, с планированием даты релиза на три месяца вперёд. 12 апреля 2010 года Perl 5.12.0 был представлен публике. Выдающиеся нововведения включают в себя поддержку нового синтаксиса package NAME VERSION, оператор Yada Yada (служащего для маркировки кода-заполнителя, который ещё не реализован), полное решение Пробемы 2038 года (Y2038), перегрузка операторов регулярных выражений, поддержку DTrace (фреймворка динамической трассировки), а также полную поддержку стандарта Unicode 5.2.perl5120delta - search.cpan.org 7 сентября 2010 года Perl 5.12.2 был выпущен. Этот релиз содержит обновление модулей, а также некоторые изменения в документации.perl5122delta - search.cpan.org Последняя версия, выпущенная 20 августа 2010 года — Perl 5.13.4.Florian Ragwitz / perl-5.13.4 - search.cpan.org Perl 6 С 2000 года идет разработка новой (6-ой) версии языка. В отличие от предыдущих версий, разработчики планируют создать четко определенный стандарт языка. В настоящее время существуют экспериментальные компиляторы Perl 6, но продолжается дальнейшая дискуссия о новых правилах. На русском языке информация о новой версии языка доступна на сайте http://perl6.ru/. Обзор Perl — язык программирования общего назначения, который был первоначально создан для манипуляций с текстом, но на данный момент используется для выполнения широкого спектра задач, включая системное администрирование, веб-разработку, сетевое программирование, игры, биоинформатику, разработку графических пользовательских интерфейсов. Язык можно охарактеризовать скорее как практичный (лёгкость в использовании, эффективность, полнота), чем красивый (элегантность, минималистичность).perlintro(1) man page Главными достоинствами языка являются поддержка различных парадигм (процедурный, объектно-ориентированный и функциональный стили программирования), контроль за памятью (без коллектора мусора, основанного на циклах), встроенная поддержка обработки текста, а также большая коллекция модулей сторонних разработчиков. Согласно Ларри Уоллу, у Perl есть два девиза. Первый — «Есть больше одного способа это сделать» («There’s more than one way to do it»), известный также под аббревиатурой TMTOWTDI. Второй слоган — «Простые вещи должны оставаться простыми, а сложные стать выполнимыми» («Easy things should be easy and hard things should be possible»). Особенности Общая структура Perl в общих чертах ведёт своё начало от языка Си. Perl — процедуральный по своей природе, имеет переменные, выражения, присваивания, блоки кода, отделяемые фигурными скобками, управляющие структуры и функции. Perl также заимствует ряд свойств из языков программирования оболочки операционной системы. Все переменные маркируются ведущими знаками, которые точно выражают тип данных переменной в этом контексте (например, скаляр, массив, хеш). Важно, что эти знаки позволяют переменным быть интерполированным в строках. Perl обладает множеством встроенных функций, которые обеспечивают инструментарий, часто используемый для программирования оболочки, например сортировку или вызов системных служб. Perl заимствует массивы из Lisp, регулярные выражения из AWK и sed, из AWK также позаимствованы хеши («ассоциативные массивы»). Регулярные выражения облегчают выполнение многих задач по парсингу, обработке текста и манипуляций с данными. Perl 5 добавил поддержку сложных типов данных, первоклассных функций (замыкание как значение) и объектную модель. В последнюю входят ссылки, пакеты, выполнение методов от класса, переменные с лексическим объявлением области видимости, а также директивы компилятору (нампример, strict). Главнейшим усовершенствованием представленным в Perl 5 стала возможность помещать код в «пакеты» (package) в качестве модулей для повторного использования. Ларри Уолл позже заметил, что «Весь замысел модульной системы Perl 5 сводился к поощрению роста культуры Perl, а не строчек кода».Usenet post, May 10, 1997, with ID 199705101952.MAA00756@wall.org Все версии Perl выполняют автоматическую типизацию данных и автоматический контроль над памятью. Интерпретатор знает тип и запросы памяти каждого объекта программы, он распределяет и освобождает память, производя подсчёт ссылок. Перевод одного типа данных в другой — например, числа в строку — происходит автоматически в рантайме, невозможные для выполнения переводы типов данных приводят к фатальной ошибке. Синтаксис языка Perl Синтаксис Perl имеет много общего с синтаксисом языков Си, Awk, sed и shell. Первая строка исходного кода может начинаться с «#!/Путь/к/Perl -ключи» — что указывает системе путь к интерпретатору Perl для выполнения программы в UNIX системах и выполнения их на веб-сервере. Изначально обработка такой строки — это функция shell, но Perl при выполнении программы также проверяет эту строку и читает из неё ключи, игнорируя путь к интерпретатору. Пример программы Простейшая программа Hello world выглядит следующим образом: print "Hello, world!\n"; либо для CGI: #!/usr/bin/perl print "Content-type: text/html\n\n"; print "Hello, world!"; Дозапись в строку. $x = 5; $x .= 0; print $x; #50 А вот так можно напечатать число гугол. print 1, 0 x 100; Типы данных Основные типы данных: скаляр, массив, хеш-таблица, функция, указание на файл, запись таблицы символов. Переменные разных типов отличаются знаком, который стоит перед именем переменной: Скаляр * Скалярные переменные используются для хранения одиночных значений. Они могут содержать числа, строки и ссылки на другие объекты. Перед именем скалярной переменной необходимо ставить знак доллара '$'. Тип скалярной переменной не фиксирован (в отличие от, например, языка Си) и определяется динамически в зависимости от контекста. Например, $x = 10; # число $y = $x + 1; # используем $x как число… $z = $x . 'string'; # … а теперь — как строку $ref = \$x; # $ref является указателем на $x $$ref = 0; # $x содержит значение 0 Строковые данные должны быть помещены в кавычки. Perl использует два вида кавычек — одиночные и двойные. Помещение строки в двойные кавычки позволяет значениям переменных, содержащимся в строке, автоматически заменить собою название переменных. Заключение сторок в одиночные кавычки предотвращает такое поведение: ## Пример интерполяции переменных в двойных кавычках $pi = 3.141592654; $var1 = 'Значение Pi - $pi\n'; print $var; # Значение Pi - $pi\n $var 2 = "Значение Pi - $pi\n"; print $var; # Значение Pi - 3.141592654 Для включения двойных кавычек в строку, которая была помещена в двойные кавычки, следует использовать отмену знака — \". Для включение одинарных кавычек в строку из ординарных кавычек — \'. Для удобства работы со строками содержащими много знаков кавычек внутри, Perl позволяет использовать альтернативные способы закавычивания. Альтернативня форма использует любую пару знаков, помещённых после буквы q (имитирует поведение одинарных кавычек) или qq (имитирует поведение двойных кавычек): ## Пример использования альтернативных кавычек $pi = 3.141592654; $link1 = q{$pi}; print $link1; # $pi $link2 = qq{$pi}; print $link2; # 3.141592654 Ещё один тип кавычек в Perl — обратные кавычки. В них помещаются программы операционной системы, вывод которых может быть передан интерпретатору Perl. Выполнение программ всегда заканчиваются символом новой строки — \n: ## Пример использования обратных кавычек для исполнения команд UNIX $space = `du -s -k /usr/local/bin`; print $space; # 6264 /usr/local/bin $sysuptime = `uptime`; print $sysuptime; # 2:24 up 1 day, 9:05, 1 user, load averages: 0.26 0.32 0.33 Массив * Массив является упорядоченным списком скаляров. Каждый элемент массива имеет порядковый индекс, с помощью которого к нему можно получить доступ. Нумерация элементов начинается с нуля, то есть первый элемент списка имеет индекс 0. Перед именем переменной-массива необходимо ставить знак '@', а для доступа к определенному элементу массива использовать знак '$', так как определенный элемент массива является скаляром . Многомерные массивы можно смоделировать, помещая в список ссылки на другие списки. @array = (1,2,3,4); # записали в массив @array четыре элемента print $array2; # напечатать третий элемент print @array2,3; # напечатать третий и четвертый элемент. # Здесь используется @, так как результат операции среза массива тоже является массивом. Хеш-таблица * Хеш-таблица представляет собой ассоциативный массив, позволяющий ассоциировать строку (называемую ключ) со скаляром (значение). Строка называется ключом, а скаляр в хеш-таблице значением. Перед именем переменной-списка необходимо ставить знак процента '%', а для доступа к определенному элементу массива необходимо ставить знак '$'. Хеш-таблицу можно инициализировать массивом или списком, состоящим из неограниченного числа последовательностей (ключ, значение). %hash = ( 'cat' => 'kitten', # здесь => - это так называемая "длинная запятая", 'dog' => 'puppy', # в этом примере по функции полностью аналогичная обыкновенной ",". 'cow' => 'calf' ); print $hash{'cat'}; #Напечатает kitten print join("-", keys %hash) ; # Вывод всех ключей. Напечатает cat-dog-cow print join("-", values %hash) ; # Вывод всех значений. Напечатает kitten-puppy-calf print join("-", %hash) ; # Напечатает cat-kitten-cow-calf-dog-puppy, так как в списковом контексте хэш автоматически # разворачивается в список (ключ, значение). Так как ключи в хэше не сортируются, # пары каждый раз будут выводиться в произвольном порядке. Функция * Функция представляет собой фрагмент исполняемого кода. Функция всегда возвращает какое-либо значение. Если возвращаемое значение явно не указано оператором return, возвращается последнее вычисленное значение. Если в функции используется return без параметров, то в зависимости от контекста вызова функции возвращается неопределённое значение undef, пустой список или вообще ничего. sub printTwo{ print 2; } sub three{ 3; } $s = \&three; print &$s; #Напечатает 3 $s = \&printTwo; # Запишем в скаляр $s ссылку на функцию - через эту ссылку она будет вызвана в следующей строке. print &$s; #Напечатает 21. `2` в коде функции, а `1` как значение, возвращаемое функцией printTwo print &printTwo #То же самое Константа * Константа представляет собой неизменяемое значение. Константа не является встроенным типом языка и эмулируется при помощи функций. Предпочтительно задавать константы с помощью стандартного модуля constant, чтобы в будущем не зависеть от возможных изменений в реализации констант. Использование: use constant MY => 2; print MY; Запись таблицы символов * Запись таблицы символов — специальный тип, в котором хранятся ссылки на все переменные других типов с таким названием, а также на символы, которые часто использует для хранения файловый дескриптор, представляющих собой указатель на файл, устройство или PIPE канал, открытые для записи, чтения или для записи и чтения. Использование: $s = ; #Читаем одну строку из дескриптора STDIN (стандартный поток ввода); скалярный контекст. @values = ; #Читаем все строчки из некоторого открытого и связанного с дескриптором FILE файла; списковый контекст. print STDOUT $s; #Печатаем в STDOUT (стандартный поток вывода) В последних версиях Perl появилась возможность хранить файловые дескрипторы в скалярах, и в новых программах предпочтительно пользоваться именно этим способом. Также таблицы символов используются для связи двух имён переменной с одним значением в памяти, создавая синонимы, которые могут быть использованы для доступа и модификации значения точно также как и оригинальное имя. Эта возможность является основой системы загружаемых модулей, классов и объектов в Perl. Регулярные выражения Важной частью Perl являются регулярные выражения. Благодаря этому Perl хорошо подходит для обработки текстов. Бо́льшая часть работы с регулярными выражениями производится при помощи операторов =~, m// и s///. Оператор m// используется для проверки на совпадение. В простейшем случае результат выражения $x =~ m/abc/ будет истинным, если и только если строка $x будет соответствовать регулярному выражению abc. Например: Поиск и замена выполняются при помощи оператора s///. Конструкция $x =~ s/abc/def/; заменит первое вхождение регулярного выражения abc на строку def. Регулярные выражения Perl настолько популярны, что они включены напрямую в другие языки, такие как PHP и JavaScript, а также существуют подключаемые библиотеки, реализующие использование выражений в компилируемых языках. Программы из одной строчки Интересной и часто используемой возможностью Perl являются так называемые one-liners — программы из одной строки, обычно задаваемые прямо в строке вызова интерпретатора с помощью ключа -e. Эта программа напечатает простые числа: perl -wle "(1 x $_) !~ /^(11+)\1+$/ && print while ++ $_" Этот пример напечатает только уникальные строки файла file, ключ -n автоматически заворачивает строку обработки в цикл, который проходит по всем строкам в файлах, указанных после текста программы: perl -ne '$s{$_}++ || print' file В этих примерах Perl напоминает своей краткостью и непонятностью с первого взгляда язык J. Также одним из подобных примеров является вызвавшая большой резонанс программа, так как на самом деле она является замаскированной командой рекурсивного удаления всех файлов, право на удаление которых есть у текущего пользователя: echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@-;;s;;$_;see' echo "test... test... test..." выполнение этой команды не влияет на работу и добавлено, скорее всего, для усыпления бдительности. То что происходит в остальном коде — совсем не очевидно из-за преднамеренно запутанного написания. В данной строчке записано всего три последовательно выполняемых команды. Запишем команду следующим образом: $? ? s:;s:s;;$?: : s;; >%-{<-|}<&|`{; ; y; -/:-@-; ; s;;$_;see Первая конструкция анализирует переменную $? — код возврата предыдущей команды. Так как перед выполнением этой конструкции дочерних процессов не создавалось, $? будет содержать 0, и выполнена будет вторая «ветка» — s;; >%-{<-|}<&|`{;. Эта команда, в свою очередь, заменяет строку в переменной-аккумуляторе $_ на =]=>%-{<-|}<&|`{ (первый символ после s устанавливает ограничитель параметров этого оператора, и хотя традиционно используются слэш '/' или '|', для неясности в этой конструкции используется ограничитель ';'). Вторая команда транслирует содержимое «аккумулятора» по достаточно сложным правилам. В левой части указано четыре диапазона символов, в правой — один. Если раскрыть эти диапазоны, получим следующее соответствие: !"#$%&'()*+,-./:;<=>?@\^_`{|} `abcdefghijklmnopqrstuvwxyz{/" - В результате содержимое $_ принимает вид system"rm -rf /" Третья же команда дважды (как инструктирует флаг ee) «вычисляет» содержимое аккумулятора — вышеуказанную деструктивную команду — и пытается заменить пустую строку в аккумуляторе на результат вычисления. Языки программирования и оболочки со схожими технологиями Perl — далеко не единственный язык, дающий богатые возможности в обработке текста. Языки программирования РЕФАЛ, Icon и Снобол предоставляют возможность использовать более полно метод программирования «сопоставления с образцом», частным случаем которого и являются регулярные выражения. Существует также полноценный shell, использующий в качестве основы язык Perl. Называется он psh и даёт возможность смешивать команды обычного шелла и самого Perl’аperlfaq3 — perldoc.perl.org. Поэзия в Perl На Perl можно даже писать стихотворения. Одно из таких стихотворений под названием «Black Perl» («Чёрная жемчужина» или «Чёрный перл») было упомянуто Ларри Уоллом в первоапрельском письме в Usenet. Оно было написано изначально для Perl 3, и по словам самого Ларри, он испытал моральное удовлетворение, когда стихотворение не прошло синтаксический анализатор в Perl 5. BEFOREHEAD: close door, each window & exit; wait until time. open spellbook, study, read (scan, select, tell us); write it, print the hex whole each watches, reverse its length, write again; kill spiders, pop them, chop, split, kill them. unlink arms, shift, wait & listen (listening, wait), sort the flock (then, warn the "goats" & kill the "sheep"); kill them, dump qualms, shift moralities, values aside, each one; die sheep! die to reverse the system you accept (reject, respect); next step, kill next sacrifice, each sacrifice, wait, redo ritual until "all the spirits are pleased"; do it ("as they say"). do it(*everyone***must***participate***in***forbidden**s*e*x*). return last victim; package body; exit crypt (time, times & "half a time") & close it, select (quickly) & warn your next victim; AFTERWORDS: tell nobody, wait, wait until time; wait until next year, next decade; sleep, sleep, die yourself, die at last Редакторы * * PSPad * ActiveState Komodo * jEdit * EPIC — Perl Editor and IDE for Eclipse * Geany * IDM Computer Solutions, Inc. — UltraEdit & UEStudio * Notepad++ См. также * Perl 6 — 6-я версия языка Perl (находится в процессе разработки); * Сравнение возможностей Perl с другими языками см. в статье Сравнение языков программирования; * JAPH; * Parrot. Ссылки * www.perl.org — Официальный сайт языка Perl * www.cpan.org — CPAN — архив библиотек для языка Perl * Perldoc — Официальная документация Perl * www.activestate.com/Products/activeperl дистрибутив Perl от ActiveState * perl6.ru — информация о новой версии Perl 6